<?php
/*
 * @Author: yukun-ABMO2O 3420326614@qq.com
 * @Date: 2023-09-30 21:45:35
 * @LastEditors: yukun-ABMO2O 3420326614@qq.com
 * @LastEditTime: 2023-10-14 22:19:07
 * @FilePath: \80\config\config.php
 */


// 引入token文件
include 'jwt.php';
// 引入 验证码文件
// 引入验证码文件
include 'verCode.php';
// 引入视图
// include 'View.php';

// 引入易支付
include 'ePay.class.php';
// 导入邮箱类
include 'config/email/sendEmail.php';

use JsonWebToken\JwtToken;
use ePayNamespace\EpayCore;


class DatabaseHandler
{
    private $pdo;

    private $epay_config;

    public function __construct()
    {

        // 易支付配置
        $this->epay_config = array(
            //支付接口地址
            'apiurl' => '',
            //商户ID
            'pid' => '',
            //商户密钥
            'key' => '',
            //默认支付类型,可传入支付宝:alipay,微信:wxpay,QQ:qqpay
            'type' => 'alipay',

            // 下面是网页支付配置,api支付不需要
            // 异步通知地址
            'notify_url' => 'http://127.0.0.1/SDK/notify_url.php',
            // 跳转通知地址
            'return_url' => 'http://127.0.0.1/SDK/return_url.php',
        );

        // mysql配置
        $db = array(
            'charset' => 'utf8', //字符集
            'port' => 3306, //数据库端口
            'type' => 'mysql', //数据库类型
            'host' => '127.0.0.1', //数据库地址
            'user' => 'root', //用户名
            'pass' => 'root', //密码
            'name' => 'pinxixi' //数据库名
        );
        $dsn = "{$db['type']}:host={$db['host']}; dbname={$db['name']}; charset={$db['charset']}; port={$db['port']}"; //数据源
        try {
            //实例化PDO类,创建PDO对象
            $this->pdo = new PDO($dsn, $db['user'], $db['pass']);
        } catch (PDOException $e) {
            die('数据库错误:' . $e->getMessage());
        }
    }

    // 预处理-查询所有数据-简化
    // 新查询方法，实现实现增删改查
    public function Query($sql, $params = [])
    {
        try {
            $stmt = $this->pdo->prepare($sql); // 准备 SQL 语句
            $success = $stmt->execute($params); // 执行 SQL 语句并传入参数
            $rowCount = $stmt->rowCount(); // 获取受影响的行数
            $lastInsertId = $this->pdo->lastInsertId(); // 获取最后插入的 ID

            if (stripos($sql, 'SELECT') === 0) { // 如果是查询语句
                if ($rowCount > 0) {
                    $stmt->setFetchMode(PDO::FETCH_ASSOC); // 设置返回数据的模式为关联数组
                    $data = $stmt->fetchAll(); // 获取所有查询结果
                    // 直接返回多条数据
                    return $data;
                } else {
                    // 没有匹配的数据
                    return null;
                }
            } else {
                // 返回执行结果
                return [
                    'success' => $success, // 表示操作是否成功。如果操作成功，该值为 true，否则为 false。
                    'rowCount' => $rowCount, // 影响行数
                    'lastInsertId' => $lastInsertId, // 插入后的 ID
                ];
            }
        } catch (PDOException $e) {
            // 捕获异常并处理错误
            return [
                'success' => false,
                'error' => $e->getMessage(),
            ];
        }
    }

    // 预处理-增删改-简化 可废弃IDU方法
    public function IDU($sql, $params = [])
    {
        try {
            $stmt = $this->pdo->prepare($sql);
            $success = $stmt->execute($params);
            $rowCount = $stmt->rowCount();
            $lastInsertId = $this->pdo->lastInsertId();

            return [
                'success' => $success, // 表示操作是否成功。如果操作成功，该值为 true，否则为 false。
                'rowCount' => $rowCount, //影响行数
                'lastInsertId' => $lastInsertId, //插入后的id
            ];
        } catch (PDOException $e) {
            // 捕获异常并处理错误
            return [
                'success' => false,
                'error' => $e->getMessage(),
            ];
        }
    }





    // 生成token,
    // $payload是要加密的数据，格式示例：
    //[ "key"=>"value"];
    //  $payload=[
    //     "userName"=>"hahahah",
    //     "age"=>"14",
    //     "sex"=>"男"
    // ];
    // $time是生效的时间，单位秒
    public function createToken($payload, $time = 3600)
    {
        $token =  JwtToken::getToken($payload, $time);
        return $token;
    }

    // 解析token，将获取的token放入即可解析
    public function verifyToken($token)
    {
        $data = JwtToken::verifyToken($token);
        if (empty($data)) {
            return null;
        } else {
            return $data;
        }
    }

    // token接收验证
    public function routeToken()
    {
        $Authorization = $_SERVER['HTTP_AUTHORIZATION'];
        // 检查token值
        if ($Authorization == '' || $Authorization == null) {
            $this->response(false, 200, '非法操作！');
        } elseif (!$this->verifyToken($Authorization)) {
            $this->response(false, 200, '登录过期,请重新登录！');
            return false;
        }
    }


    // 统一响应格式，
    public function response($data = [], $code = 200, $msg = 'success')
    {
        // 设置 HTTP 头部，指示输出为 JSON 格式
        header('Content-Type: application/json');
        // 创建一个关联数组
        $response  = array(
            'code' => $code,
            'msg'  => $msg,
            'data' => $data
        );
        // 将数组转换为 JSON 字符串
        echo json_encode($response);
    }


    // 文件上传
    public function uploadPictures($picArray, $path = "public/image")
    {
        $result = array();
        // 创建保存图片的文件夹
        $folderName = date("YmdHis");
        $folderPath = $path;
        if (!file_exists($folderPath)) {
            mkdir($folderPath, 0777, true);
        }
        // 遍历图片数组
        foreach ($picArray['tmp_name'] as $key => $tmp_name) {
            $file_name = date("YmdHis") . "_" . $picArray['name'][$key];
            $file_path = $folderPath . "/" . $file_name;
            // 判断协议
            $protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
            // 绝对路径
            $Repath = $protocol . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
            // 移动上传的图片到指定的文件夹中
            if (move_uploaded_file($tmp_name, $file_path)) {
                $result[] = $_SERVER['REQUEST_URI'] . $folderPath . $file_name;
            }
        }
        return $result;
    }

    // 删除文件
    public function deleteFile($fileName, $path = "public/image")
    {
        $filePath = realpath($path . '/' . $fileName);
        if ($filePath !== false && is_file($filePath)) {
            if (unlink($filePath)) {
                return true; // 表示成功
            } else {
                return false; // 表示失败
            }
        } else {
            return false; // 表示失败
        }
    }

    // 验证码
    public function createCode($num = false, $base64 = true)
    {
        $createCode = new verCode();
        return  $createCode->createCode($num, $base64);
    }

    // 创建视图
    public function renderView($template, $data = null)
    {
        // 接受模板文件的名称作为参数，并将其存储在 $template 属性中
        // 将 $data 数组中的数据提取为变量，使其在模板中可用
        extract($data);
        // 获取模板文件的完整路径，包括子文件夹
        $templatePath = 'views/' . $template . '.php';
        // 检查模板文件是否存在
        if (file_exists($templatePath)) {
            include($templatePath);
        } else {
            // 如果模板文件不存在，可以处理错误或提供一个默认的错误模板
            echo "错误：找不到模板！";
        }
    }



    //页面跳转支付
    public function pagePay($parameter)
    {
        $epay = new EpayCore($this->epay_config);
        $html_text = $epay->pagePay($this->epayParam($parameter));
        return $html_text;
    }

    // api接口支付
    public function apiPay($parameter)
    {
        $epay = new EpayCore($this->epay_config);
        $res = $epay->apiPay($this->epayParam($parameter));
        return  $res;
    }
    // 易支付参数设置
    private function epayParam($parameter)
    {
        // 如果没有指定支付方式,启用默认方式
        if (!$parameter["type"]) {
            $parameter["type"] = $this->epay_config['type'];
        }
        // 如果没有 异步通知地址 就使用默认
        if (!$parameter["notify_url"]) {
            $parameter["notify_url"] = $this->epay_config['notify_url'];
        }
        // 如果没有 跳转通知地址 就使用默认
        if (!$parameter["return_url"]) {
            $parameter["return_url"] = $this->epay_config['return_url'];
        }
        // 如果没有传入IP地址 添加默认
        if (!$parameter["clientip"]) {
            $parameter["clientip"] = "192.168.1.1";
        }
        $parameter["pid"] = $this->epay_config['pid'];
        return $parameter;
    }

    // 查询易支付订单 输入业务订单号
    public function queryEpayOrder($out_trade_no)
    {
        $url = $this->epay_config['apiurl'] . 'api.php?act=order&pid=' . $this->epay_config['pid'] . '&key=' . $this->epay_config['key'] . '&out_trade_no=' . $out_trade_no;
        $response = $this->sendRequest($url, [], "GET");
        return $response;
    }
    // 发起支付（获取链接）
    public function getPayLink($parameter)
    {
        $epay = new EpayCore($this->epay_config);
        $res = $epay->getPayLink($this->epayParam($parameter));
        return  $res;
    }


    // 网络请求
    public  function sendRequest($url, $data = array(), $method = 'POST')
    {
        $curl = curl_init();

        if ($method == 'POST') {
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
        } elseif ($method == 'GET' && !empty($data)) {
            $url .= '?' . http_build_query($data);
        }
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        $response = curl_exec($curl);

        if (curl_errno($curl)) {
            // echo 'Curl error: ' . curl_error($curl);
        }

        curl_close($curl);

        return $response;
    }

    // 发送邮箱
    public function sendEmail($param,$files=[])
    {
        
        $email = new sendEmail();
       return $email->send($param,$files);
        // var_dump($tf);
    }
}
